环境
vs 2017
windows 7 32位
windbg
我用的是vs2017编译的poc.c(我这边的话需要设置 不使用预编译头),但是在windows 7上没有崩溃
后来我使用看雪的poc编译(https://bbs.pediy.com/thread-178154.htm),那就可以触发崩溃了
1 | kd> g |
id打开win32k.sys
跟着作者,来着这个异常函数,里面调用了pprFlattenRec
1 | signed int __thiscall EPATHOBJ::bFlatten(EPATHOBJ *this) |
在EPATHOBJ::pprFlattenRec之后调用EPATHOBJ::newpathrec,之后newpathalloc
1 | struct PATHALLOC *__stdcall newpathalloc() |
我们添加结构体继续分析
1 | typedef struct _PATHRECORD { |
在 EPATHOBJ::pprFlattenRec里面,我们将v29转化成struct显示
1 | if ( EPATHOBJ::newpathrec(this, &v29, &v27, 0x7FFFFFFFu) == (struct PATHALLOC *)1 ) |
漏洞利用
漏洞利用还是复杂了点,主要是新建了三个record
1 | // |
填充freelist,据说是创建贝里尔曲线,以便在其直线化的时候调用漏洞函数
1 | // Generate a large number of Belier Curves made up of pointers to our |
最后
v3->prev->next = v3;
就可以把HalDispatchTable改写
reference
《漏洞战争》